home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 038 < prev    next >
Internet Message Format  |  1997-05-06  |  41KB

  1. From: pottier@clipper.ens.fr (Francois Pottier)
  2. Subject: csmp-digest-v3-038
  3. Date: Tue, 21 Jun 1994 14:04:20 +0200 (MET DST)
  4.  
  5. C.S.M.P. Digest             Tue, 21 Jun 94       Volume 3 : Issue 38
  6.  
  7. Today's Topics:
  8.  
  9.         CopyBits with PixMap
  10.         Gestalt, SU3.0 & List Manager
  11.         How to tell what kind of drive a volume is?
  12.         Photoshop Plug-in Filters useable with other programs?
  13.         Scheduling Sleep in WaitNextEvent
  14.         What is "Clipping Extension"?
  15.         allocating memory quickly -- how?
  16.         sqrti() [Re: Faster Square Root Algorithm]
  17.  
  18.  
  19.  
  20. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  21. (pottier@clipper.ens.fr).
  22.  
  23. The digest is a collection of article threads from the internet newsgroup
  24. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  25. regularly and want an archive of the discussions.  If you don't know what a
  26. newsgroup is, you probably don't have access to it.  Ask your systems
  27. administrator(s) for details.  If you don't have access to news, you may
  28. still be able to post messages to the group by using a mail server like
  29. anon.penet.fi (mail help@anon.penet.fi for more information).
  30.  
  31. Each issue of the digest contains one or more sets of articles (called
  32. threads), with each set corresponding to a 'discussion' of a particular
  33. subject.  The articles are not edited; all articles included in this digest
  34. are in their original posted form (as received by our news server at
  35. nef.ens.fr).  Article threads are not added to the digest until the last
  36. article added to the thread is at least two weeks old (this is to ensure that
  37. the thread is dead before adding it to the digest).  Article threads that
  38. consist of only one message are generally not included in the digest.
  39.  
  40. The digest is officially distributed by two means, by email and ftp.
  41.  
  42. If you want to receive the digest by mail, send email to listserv@ens.fr
  43. with no subject and one of the following commands as body:
  44.     help                        Sends you a summary of commands
  45.     subscribe csmp-digest Your Name    Adds you to the mailing list
  46.     signoff csmp-digest            Removes you from the list
  47. Once you have subscribed, you will automatically receive each new
  48. issue as it is created.
  49.  
  50. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  51. Questions related to the ftp site should be directed to
  52. scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
  53. digest are available there.
  54.  
  55. Also, the digests are available to WAIS users.  To search back issues
  56. with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
  57. http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
  58.  
  59.  
  60. -------------------------------------------------------
  61.  
  62. >From ragatz@nevada.edu (Steven Ragatz)
  63. Subject: CopyBits with PixMap
  64. Date: 5 Jun 1994 09:52:39 GMT
  65. Organization: University of Nevada System Computing Services
  66.  
  67. I am working through the examples in D. Mark's second Primer book using 
  68. Think C/C++ v. 6.xx.  I am trying to use CopyBits to copy a PixMap to a 
  69. window.  I think that I have typed the code in correctly and I have 
  70. looked at the appropriate header files but things are still wrong.  Here is 
  71. the code in question:
  72.  
  73. #include <Picker.h>
  74. #include <Palette.h>
  75.  
  76.     #define NIL_POINTER    0L
  77.     WindowPtr    gColorWindow;
  78.     Rect        source, dest;
  79. ...
  80. /* Setup rects and stuff */
  81. ...
  82.      CopyBits( &((CGrafPtr)gColorWindow)->portPixMap, 
  83.           &((CGrafPtr)gColorWindow)->portPixMap, 
  84.            &source, &dest, srcCopy, NIL_POINTER );        
  85.     
  86. The error that the compiler gives is:
  87.  
  88. File Ă’ColorTutor.c; Line 305
  89. Error:   first argument to function CopyBits does not match prototype
  90.  
  91. so... I look up CopyBits and find it to be:
  92.  
  93. pascal void CopyBits(const BitMap *srcBits,const BitMap *dstBits,const 
  94.     Rect *srcRect, const Rect *dstRect,short mode,RgnHandle maskRgn)
  95.  
  96. I am under the impression that with QD, CopyBits uses PixMaps the same 
  97. way as it used to use BitMaps.
  98.  
  99. I looked up an example that uses a GrafPtr cast instead of a CGrafPtr and 
  100. it works as:
  101.  
  102.     CopyBits (& ((GrafPtr)Port1)->portBits, &((GrafPtr)Port2)->portBits, 
  103.           &Rect1, &Rect2, 0, theregion);
  104.  
  105. so, I am left confused and stumped.  Could anyone tell me where I am 
  106. going wrong with my data structures?
  107.  
  108. -    Steve
  109.  
  110. +++++++++++++++++++++++++++
  111.  
  112. >From alex@metcalf.demon.co.uk (Alex Metcalf)
  113. Date: Sun, 5 Jun 1994 16:19:56 GMT
  114. Organization: Best Before Yesterday
  115.  
  116. In article <2ss797$s80@post-office.nevada.edu>, ragatz@nevada.edu (Steven
  117. Ragatz) wrote:
  118.  
  119. > I am working through the examples in D. Mark's second Primer book using 
  120. > Think C/C++ v. 6.xx.  I am trying to use CopyBits to copy a PixMap to a 
  121. > window.  I think that I have typed the code in correctly and I have 
  122. > looked at the appropriate header files but things are still wrong.  Here is 
  123. > the code in question:
  124. > #include <Picker.h>
  125. > #include <Palette.h>
  126. >     #define NIL_POINTER    0L
  127. >     WindowPtr    gColorWindow;
  128. >     Rect        source, dest;
  129. > ...
  130. > /* Setup rects and stuff */
  131. > ...
  132. >      CopyBits( &((CGrafPtr)gColorWindow)->portPixMap, 
  133. >           &((CGrafPtr)gColorWindow)->portPixMap, 
  134. >            &source, &dest, srcCopy, NIL_POINTER );        
  135. >     
  136. > The error that the compiler gives is:
  137. > File ColorTutor.c; Line 305
  138. > Error:   first argument to function CopyBits does not match prototype
  139.  
  140. Steve,
  141.  
  142.      Code looks OK: just typecast your portPixMap to a (BitMap *) like
  143. this:
  144.  
  145. CopyBits ( (BitMap *) ((CGrafPtr)gColorWindow)->portPixMap, ...
  146.  
  147.      Alex
  148.  
  149. --
  150. Alex Metcalf, Best Before Yesterday
  151. Mac programmer in C, C++, HyperTalk, assembler
  152. Juggler, 3-ball tricks
  153.  
  154. Internet:          alex@metcalf.demon.co.uk
  155. Fax (UK):          (0570) 45636
  156. Fax (US / Canada): 011 44 570 45636
  157.  
  158. +++++++++++++++++++++++++++
  159.  
  160. >From kenlong@netcom.com (Ken Long)
  161. Date: Sun, 5 Jun 1994 16:22:58 GMT
  162. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  163.  
  164. I download a working version of Dave Mark's "ColorTotor" from America 
  165. Online, a couple years ago.  It's currently in my floppy archives.  
  166. someone else could probably answer your question before I log off, get it, 
  167. log on and send you the fragment.
  168.  
  169. But I was also amazed at the similaritios between that program and one 
  170. called "CopyBits" which I got of ftp devtools.symantec.com.  I'd heard 
  171. mention of this source in a few conferences, but no one ever said where 
  172. to find it.  It's much more sophisticated and has greater scope than 
  173. Dave's little ditty.
  174.  
  175. -Ken-
  176.  
  177. +++++++++++++++++++++++++++
  178.  
  179. >From arose@ATHENA.MIT.EDU (Alex Rosen)
  180. Date: 5 Jun 1994 17:30:33 GMT
  181. Organization: Massachusetts Institute of Technology
  182.  
  183. [Confusion about copybits parameters]
  184.  
  185. Here's a message I saved from Tim Dierks from quite a while ago, which
  186. explains it very cleary.
  187. --Alex
  188.  
  189.  
  190. In article <w4s36la@rpi.edu>, raffuj@aix.rpi.edu (Jose Raffucci) wrote:
  191. > I'm really curious about what parameters should actually passed to 
  192. > copybits.  IM V and think ref 1.0 say the first two should be address 
  193. > of a pixmap or bitmap.  The examples all show :
  194. >  CopyBits(&(GrafPtr)->portBits, ...);
  195. > In IM VI however (21-19) it says that you can pass it the following:
  196. >  pixBase =  GetGWorldPixMap(world);   (pixbase is PixMapHandle)
  197. >  CoypBits( *pixBase, ...);                       
  198. > 1 worlds, and 2 doesn't.  I looked and the addresses returned for 1&2
  199. > are not the same.  close, but not quite.  I've played around with just about
  200. > every way toet the address of the pixmap for 2, and nothing works, and yes, 
  201. > I locked my handles.
  202. > Why the apparent inconsistency?  
  203.  
  204. CopyBits is definitely the wackiest call in the ToolBox.  It can accept
  205. three different kinds of parameters for its "sourceBits" and "destBits"
  206. arguments:
  207.  
  208.  - A pointer to a BitMap
  209.  - A pointer to a PixMap
  210.  - A pointer to the spot in a CGrafPort where a BitMap is supposed to be
  211.    if this port were actually a GrafPort
  212.  
  213. It's got a little song and dance it does to figure out what it's getting,
  214. but that's not important.  The weirdest thing is that you can pass in a
  215. pointer to a PixMap, which is the PixMapHandle dereferenced once.  This
  216. PixMapHandle does not have to be locked; even though CopyBits can move
  217. memory, it won't do so until after it's figured out what kind of
  218. arguments it's getting and recovered the original handle, if necessary.
  219.  
  220. I don't know if this will help you solve your problem, but it's certainly
  221. entertained me to tell you this.
  222.  
  223. Tim Dierks                                                   
  224. absurd@apple.com
  225.                   I work for MacDTS, but I speak for myself.
  226.  "If you can't lick 'em, put 'em on with a big piece of tape." -
  227. Negativland
  228.  
  229.  
  230.  
  231.  
  232. ---------------------------
  233.  
  234. >From r4650001@nickel.laurentian.ca
  235. Subject: Gestalt, SU3.0 & List Manager
  236. Date: 4 Jun 94 16:36:53 -0500
  237. Organization: Laurentian University
  238.  
  239. Does anybody know if there is a Gestalt selector code to see if System Update
  240. 3.0 is installed? Specifically, I want to know if the new LDEF used by the
  241. StandardGetFile dialog box is available. (i.e. the one that puts an icon next
  242. to the item name.) Also, I would like to know what format the data should be
  243. in when I pass a handle to LSetCell(sic).
  244.  
  245. E-mail is preferred, but if you post to the group, that's ok.
  246.  
  247. --JA
  248. R4650001@nickel.laurentian.ca
  249.  
  250. +++++++++++++++++++++++++++
  251.  
  252. >From wysocki@netcom.com (Chris Wysocki)
  253. Date: Sat, 4 Jun 1994 23:18:26 GMT
  254. Organization: Netcom Online Communications Services (408-241-9760 login: guest)
  255.  
  256. In article <1994Jun4.163653.1@nickel.laurentian.ca> r4650001@nickel.laurentian.ca writes:
  257.  
  258. >Does anybody know if there is a Gestalt selector code to see if System Update
  259. >3.0 is installed? Specifically, I want to know if the new LDEF used by the
  260. >StandardGetFile dialog box is available. (i.e. the one that puts an icon next
  261. >to the item name.)
  262.  
  263. Call Gestalt with the "gestaltStandardFileAttr" ('stdf') selector and
  264. test the "gestaltStandardFileHasColorIcons" bit (2) in the response.
  265.  
  266. >Also, I would like to know what format the data should be
  267. >in when I pass a handle to LSetCell(sic).
  268.  
  269. I don't believe that the format of the data used by the Standard File
  270. LDEF has been documented.  If this is in fact the case, I would
  271. recommend _not_ trying to reverse-engineer the format, as this is
  272. prone to breaking in the future.  Instead, write your own LDEF that
  273. does what you want.  LDEFs aren't very hard to write; I imagine that a
  274. reasonably competent Macintosh programmer could write such an LDEF in
  275. a few hours, if not less.
  276.  
  277. Chris.
  278.  
  279.  
  280. +++++++++++++++++++++++++++
  281.  
  282. >From Alexander M. Rosenberg <alexr@apple.com>
  283. Date: Mon, 6 Jun 1994 02:14:33 GMT
  284. Organization: Hackers Anonymous
  285.  
  286. In article <wysockiCqwBEq.M9B@netcom.com> Chris Wysocki, wysocki@netcom.com
  287. writes:
  288. > I don't believe that the format of the data used by the Standard File
  289. > LDEF has been documented.  If this is in fact the case, I would
  290. > recommend _not_ trying to reverse-engineer the format, as this is
  291. > prone to breaking in the future.  Instead, write your own LDEF that
  292. > does what you want.  LDEFs aren't very hard to write; I imagine that a
  293. > reasonably competent Macintosh programmer could write such an LDEF in
  294. > a few hours, if not less.
  295.  
  296. I agree with Chris.
  297.  
  298. DO NOT REVERSE ENGINEER THE SYSTEM SOFTWARE AND USE THAT INFORMATION IN YOUR
  299. APPLICATIONS! WE WILL HUNT YOU DOWN AND KILL YOU.
  300.  
  301. In this case, I was just speaking with the Software Mercenary responsible for
  302. including the Macintosh Easy Open version of Standard File in System Update
  303. 3.0. We were speaking of a way to increase the limit of items that can be
  304. displayed for a given directory. Doing so would specifically break people who
  305. "know" the format of the cell data.
  306. - -------------------------------------------------------------------------
  307. -  Alexander M. Rosenberg  - INTERNET: alexr@apple.com      - Yoyodyne    -
  308. -  330 Waverley St., Apt B - UUCP:ucbvax!apple!alexr        - Propulsion  -
  309. -  Palo Alto, CA 94301     -                                - Systems     -
  310. -  (415) 329-8463          - Nobody is my employer so       - :-)         -
  311. -                          - nobody cares what I say.       -             -
  312.  
  313. ---------------------------
  314.  
  315. >From mpcline@cats.ucsc.edu (Matthew Paul Cline)
  316. Subject: How to tell what kind of drive a volume is?
  317. Date: 2 Jun 1994 23:17:36 GMT
  318. Organization: University of California, Santa Cruz
  319.  
  320.  
  321.     Is there any sort of system call that will tell you the type
  322. of a volume (flopyy driver, hard drive, or other)?  Thanks in advance.
  323. -- 
  324. Poodles have no honor.               Have you hugged your shoggoth today?
  325. GE d? -p+ c++(+++) l++ u++ e+ m+ s/- n+(-) h+ f !g w+ t+ r y+
  326.  
  327. +++++++++++++++++++++++++++
  328.  
  329. >From mclow@coyote.csusm.edu (Marshall Clow)
  330. Date: 2 Jun 1994 16:59:01 -0700
  331. Organization: California State University San Marcos
  332.  
  333. Matthew Paul Cline (mpcline@cats.ucsc.edu) wrote:
  334.  
  335. >    Is there any sort of system call that will tell you the type
  336. >of a volume (flopyy driver, hard drive, or other)?  Thanks in advance.
  337.  
  338. Not in general, but you can infer a lot about a volume from looking
  339. at a few bits of information.
  340.  
  341. 1) What driver talks to it? Is it '.Sony'? Then it's a floppy.
  342. 2) Is the driver in the range for SCSI devices?
  343. 3) Is the volume read-only?
  344. 4) Is the volume ejectable?
  345. 5) Is the volume "remote"?
  346. .. and so on.
  347.  
  348. None of the information is conclusive, but you can figure out what
  349. you need to know >95% of the time.
  350.  
  351. Marshall Clow
  352. Aladdin Systems
  353. mclow@san_marcos.csusm.edu
  354.  
  355.  
  356. +++++++++++++++++++++++++++
  357.  
  358. >From Jerry.Halstead@launchpad.unc.edu (jerry halstead)
  359. Date: 3 Jun 1994 00:45:39 GMT
  360. Organization: University of North Carolina Extended Bulletin Board Service
  361.  
  362. reply to message from mpcline@cats.ucsc.edu:
  363.  
  364. I got some help last week correlating between a vRefNum and the actual
  365. SCSI ID.  I used PBHGetVInfo to get the refnum and the following formula
  366. to convert to a SCSI ID:
  367.  
  368.  HParamBlockRec    volPB;
  369.  volPB.volumeParam.ioVRefNum = 0;
  370.  volPB.volumeParam.ioNamePtr = (StringPtr)name;
  371.  volPB.volumeParam.ioVolIndex = i;   // this is in a loop to get all drivers
  372. if (PBHGetVInfo(&volPB,FALSE) == noErr){        
  373.    RefNum = abs(volPB.volumeParam.ioVDRefNum+1);
  374.    scsiID = RefNum-32;  }
  375.  
  376. I then use the scsiID with the SCSI manager routines to obtain Inquiry data
  377. for the given drive, which includes, among other things, the device type. 
  378. Here's the beginnings of the device type table from the SCSI spec:
  379.  
  380. ____SCSI_Dev_types___
  381. direct access (disk) 0
  382. seq access (tape)    1
  383. printer device       2
  384. processor            3
  385. worm                 4
  386. cd-rom               5
  387.  
  388. Of course this may not be the level of implementation you had in mind. 
  389. Hope it helps.
  390.  
  391.  
  392. Big head Jerry and the demonstrables....
  393. --
  394. - ----------------------------------------------------------------------------
  395.  \ The above does not represent OIT, UNC-CH, laUNChpad, or its other users. /
  396.    ------------------------------------------------------------------------
  397.  
  398. +++++++++++++++++++++++++++
  399.  
  400. >From blob@apple.com (Brian Bechtel)
  401. Date: 4 Jun 1994 07:00:36 -0700
  402. Organization: Apple Computer, Inc., Cupertino, California
  403.  
  404. mclow@coyote.csusm.edu (Marshall Clow) writes:
  405.  
  406. >Matthew Paul Cline (mpcline@cats.ucsc.edu) wrote:
  407.  
  408. >>    Is there any sort of system call that will tell you the type
  409. >>of a volume (flopyy driver, hard drive, or other)?  Thanks in advance.
  410.  
  411. >Not in general, but you can infer a lot about a volume from looking
  412. >at a few bits of information.
  413.  
  414. >1) What driver talks to it? Is it '.Sony'? Then it's a floppy.
  415.  
  416. Or an HD 20.  Or something which is trying to emulate either a floppy or
  417. an HD 20.  (The HD 20 was the first Apple-labeled Macintosh hard drive.
  418. It did not use SCSI.)
  419.  
  420. >2) Is the driver in the range for SCSI devices?
  421.  
  422. With Asynchronous SCSI Manager 4.3, SCSI devices have can drivers
  423. outside the traditional range.
  424.  
  425. >3) Is the volume read-only?
  426. >4) Is the volume ejectable?
  427. >5) Is the volume "remote"?
  428. >.. and so on.
  429.  
  430. >None of the information is conclusive, but you can figure out what
  431. >you need to know >95% of the time.
  432.  
  433. Yup.
  434.  
  435. --Brian Bechtel     blob@apple.com     "My opinion, not Apple's"
  436.  
  437. +++++++++++++++++++++++++++
  438.  
  439. >From dshayer@netcom.com (David Shayer)
  440. Date: Sun, 5 Jun 1994 22:36:37 GMT
  441. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  442.  
  443. Brian Bechtel (blob@apple.com) wrote:
  444. : mclow@coyote.csusm.edu (Marshall Clow) writes:
  445. : >Matthew Paul Cline (mpcline@cats.ucsc.edu) wrote:
  446. : >>    Is there any sort of system call that will tell you the type
  447. : >>of a volume (flopyy driver, hard drive, or other)?  Thanks in advance.
  448. : >1) What driver talks to it? Is it '.Sony'? Then it's a floppy.
  449. : Or an HD 20.  Or something which is trying to emulate either a floppy or
  450. : an HD 20.  (The HD 20 was the first Apple-labeled Macintosh hard drive.
  451. : It did not use SCSI.)
  452.  
  453. You can tell a floppy from an HD20 by driver refnum.  The floppy driver
  454. has refnum -5, while the hd20 driver has refnum -2.
  455.  
  456.  
  457. +------------------------------------------------------------------------+
  458. |David Shayer                                  (415) 595-2523            |
  459. |Sentient Software / Symantec                  shayer@applelink.apple.com|
  460. |"Subvert the Dominant Paradigm."              Applelink: SHAYER         |
  461. +------------------------------------------------------------------------+
  462.  
  463.  
  464. ---------------------------
  465.  
  466. >From idowell@bbn.com (Ian Dowell)
  467. Subject: Photoshop Plug-in Filters useable with other programs?
  468. Date: 7 Jun 94 04:35:24 GMT
  469. Organization: Bolt, Beranek and Newman Inc.
  470.  
  471. Are Photoshop Plug-in Filters useable with other programs? 
  472. Is it possible to write a program which could use the filters
  473. to do transformations?
  474. Is there any documentation or example code available?
  475.  
  476. Thanks in advance!
  477. Ian
  478. -- 
  479. - ----------------------------------------------------------------------
  480. Ian Dowell            Bolt, Beranek & Newman, Cambridge, MA
  481. idowell@bbn.com       (617) 873-2673
  482.  
  483. +++++++++++++++++++++++++++
  484.  
  485. >From tgaul@halcyon.com (Troy Gaul)
  486. Date: Mon, 06 Jun 1994 22:35:41 -0700
  487. Organization: Infinity Systems
  488.  
  489. In article <idowell.770963724@labs-n.bbn.com>, idowell@bbn.com (Ian Dowell)
  490. wrote:
  491.  
  492. > Are Photoshop Plug-in Filters useable with other programs? 
  493. > Is it possible to write a program which could use the filters
  494. > to do transformations?
  495. > Is there any documentation or example code available?
  496.  
  497. Photoshop filters, in general, are usable by other programs.  To write such
  498. a program, simply follow the interface given in the Adobe plug-in
  499. specification files (the same ones you need if you're writing plug-ins). 
  500. You can find this specification in various places online, including from
  501. anonymous FTP at:
  502.  
  503. ftp://export.acs.cmu.edu//pub/PSarch/misc-mac/PS2.5Developers_Kit.cpt.hqx
  504.  
  505. The plug-ins _included_ with Photoshop, however, are not usable by other
  506. programs because of a passwording sceme they use to verify that they are
  507. talking to Photoshop.
  508.  
  509. _troy
  510. //////// //////___Troy Gaul_________________________tgaul@halcyon.com__ //
  511.   //    //       Infinity Systems ; Redmond, Washington                //
  512.  //    //  //  "Insert witty quote here."                             //
  513. //    //////________________________________________________________ //
  514.  
  515. ---------------------------
  516.  
  517. >From Ken Prehoda <kenp@nmrfam.wisc.edu>
  518. Subject: Scheduling Sleep in WaitNextEvent
  519. Date: 4 Jun 1994 02:54:55 GMT
  520. Organization: Univ of Wisc-Madison
  521.  
  522. I have a number of questions concerning calling WaitNextEvent.
  523.  
  524. First, it has been mentioned that WaitNextEvent should
  525. only be called about once a second (possibly when
  526. you aren't doing anything).  What is the best way to accomplish
  527. this?
  528.  
  529. Second, what is the best way to schedule the sleep
  530. parameter?  I can envision four situations that may
  531. require different values for sleep:
  532.  
  533. 1) I'm in the foreground and doing something.
  534.  
  535. 2) I'm in the foreground and doing nothing.
  536.  
  537. 3) I'm in the background doing something.
  538.  
  539. 4) I'm in the background doing nothing.
  540.  
  541. What are the best values in these situations?
  542.  
  543. Thanks,
  544. Ken Prehoda
  545. kenp@nmrfam.wisc.edu
  546.  
  547. +++++++++++++++++++++++++++
  548.  
  549. >From rmah@panix.com (Robert S. Mah)
  550. Date: Fri, 03 Jun 1994 23:38:47 -0500
  551. Organization: One Step Beyond
  552.  
  553. Ken Prehoda <kenp@nmrfam.wisc.edu> wrote:
  554.  
  555. > I have a number of questions concerning calling WaitNextEvent.
  556. > First, it has been mentioned that WaitNextEvent should only be called
  557. > about once a second (possibly when you aren't doing anything).  What 
  558. > is the best way to accomplish this?
  559.  
  560. Not exactly.  When people refered to fixed-time calling of WNE it was in
  561. the context of executing computationally intensive code and still giving
  562. time to other apps.  IOW, being a nice coop multi-tasking app (NCMTA).
  563.  
  564. When you're not doing anything that's computationally intensive, that is,
  565. you don't need idle time, just give the sleep value something really big.
  566.  
  567. What will happen is that any time you're app gets a real event such as
  568. a mouse down or an update, WNE will return immediately after the event is
  569. posted (as long as the other apps are NCMTA's) so you can handle it.
  570.  
  571. If you're app doesn't need to do anything (i.e. there are no events
  572. pending),
  573. then WNE won't bother returning until either 1) the sleepTime has passed or
  574. 2) none of the other apps need to do anything either.
  575.  
  576. To sum up.  The sleep parameter is a _suggestion_ to WNE about how much
  577. time
  578. you need between idle events.  WNE may return before it has elapsed if the
  579. machine is not busy.  It may return after it has elapsed if the machine is
  580. really busy.  The fixed-timing technique for calling WNE is to assure your
  581. app gets a large timeslice when it is executing some critical and intensive
  582. code.
  583.  
  584. Cheers,
  585. Rob
  586. ___________________________________________________________________________
  587. Robert S. Mah  -=-  One Step Beyond  -=-  212-947-6507  -=-  rmah@panix.com
  588.  
  589. +++++++++++++++++++++++++++
  590.  
  591. >From j-norstad@nwu.edu (John Norstad)
  592. Date: Fri, 03 Jun 1994 23:11:44 -0500
  593. Organization: Northwestern University
  594.  
  595. In article <2soqdv$jeu@news.doit.wisc.edu>, Ken Prehoda
  596. <kenp@nmrfam.wisc.edu> wrote:
  597.  
  598. > I have a number of questions concerning calling WaitNextEvent.
  599. > First, it has been mentioned that WaitNextEvent should
  600. > only be called about once a second (possibly when
  601. > you aren't doing anything).  What is the best way to accomplish
  602. > this?
  603. > Second, what is the best way to schedule the sleep
  604. > parameter?  I can envision four situations that may
  605. > require different values for sleep:
  606. > 1) I'm in the foreground and doing something.
  607. > 2) I'm in the foreground and doing nothing.
  608. > 3) I'm in the background doing something.
  609. > 4) I'm in the background doing nothing.
  610. > What are the best values in these situations?
  611.  
  612. These are very good and very difficult questions, and not everyone agrees
  613. on the answers. (I just had a debate about this issue with Leonard
  614. Rosenthol today, in fact.)
  615.  
  616. Here's what I do, in three different circumstances:
  617.  
  618. (1) In my main event loop, when my program is idle, I call WNE with sleep
  619. = GetCaretTime(). This gives other non-idle processes plenty of time, and
  620. in the case where I'm in the foreground and my active window includes a
  621. text editing field, it keeps my caret blinking. I also pass a mouseRgn
  622. parameter to WNE in this call, to get woken up immediately if I'm in the
  623. foreground and the user moves the mouse and I need to adjust the cursor.
  624.  
  625. (2) During CPU-intensive tasks, I call a "GiveTime" function periodically.
  626. This function calls WNE once every five ticks with sleep=0 and
  627. mouseRgn=nil. It handles at least update, activate, suspend, and resume
  628. events. It also checks for user cancel actions (Command-period, Escape,
  629. click on Cancel button in status window, or whatever). It also keep my
  630. animated cursor spinning.
  631.  
  632. It's important to throttle your WNE calls in this case. Your GiveTime
  633. function should only call WNE every 4-6 ticks (Apple-recommended values).
  634. This avoids excessive process switching (thrashing), gives other
  635. CPU-intensive tasks plenty of time, makes the foreground process
  636. responsive to user actions when you are in the background, doesn't slow
  637. you down noticeable on an otherwise idle system, gives excellent response
  638. to user cancel operations, gives a smoothly animated cursor, and provides
  639. uniform behavior independent of CPU speed. It's a good balance.
  640.  
  641. You mentioned only calling WNE once per second (60 ticks). That's way too
  642. long - you are really hogging the CPU. 5 ticks is much more appropriate.
  643.  
  644. (3) When waiting for a network task to complete (e.g., during an
  645. asynchronous MacTCP send or receive call, while I'm polling the result
  646. code in the parameter block), I call WNE continuously with sleep=0 and
  647. mouseRgn=nil. The difference between (2) and (3) is that (3) doesn't
  648. throttle the WNE calls to every 5 ticks. This is because I have nothing to
  649. compute in this case, so I want to yield to other processes immediately to
  650. let them use the available CPU time while I'm waiting. I use the same
  651. GiveTime function as in (2), but I pass a parameter telling it to call WNE
  652. even if the 5 ticks hasn't expired.
  653.  
  654. Notice that I don't do anything special when I'm in the background - the
  655. algorithm is the same. Some people use a non-zero sleep time when they're
  656. in the backgound doing CPU-intensive tasks. This slows you down quite a
  657. bit, even on an otherwise idle system, and I think it's wrong. The correct
  658. way to yield time to other processes when you are in the background is to
  659. make certain you call WNE at least every 5 ticks, not to use a non-zero
  660. sleep time. Indeed, this is always the correct way to yield time to other
  661. processes, and being in background or in the foreground really doesn't
  662. matter.
  663.  
  664. As an example, here's my GiveTime function in NewsWatcher:
  665.  
  666. /*----------------------------------------------------------------------------
  667.    GiveTime
  668.    
  669.    Give time to other processes during long operations and check for 
  670.    user cancels.
  671.    
  672.    Entry:   waiting = true if waiting for MacTCP or something else.
  673.    
  674.    Exit:    function result = error code (userCanceledErr if canceled
  675.                by user, else noErr).
  676. - --------------------------------------------------------------------------*/
  677.  
  678. OSErr GiveTime (Boolean waiting)
  679. {
  680.    EventRecord ev;
  681.    Boolean gotEvt;
  682.    static long nextTime = 0;
  683.       
  684.    if (!gLongOperation) {
  685.       HiliteMenu(0);
  686.       SpinCursor(0);
  687.       ShowCursor();
  688.       gLongOperation = true;
  689.    }
  690.  
  691.    if (TickCount() >= nextTime) {
  692.       SpinCursor(16);
  693.       nextTime = TickCount() + 5;
  694.       waiting = true;
  695.    }
  696.  
  697.    if (waiting) {
  698.       gotEvt = WaitNextEvent(everyEvent, &ev, 0, nil);
  699.       if (gotEvt) HandleEvent(&ev);
  700.    }
  701.    
  702.    return gCancel ? userCanceledErr : noErr;
  703. }
  704.  
  705. The "HandleEvent" function is the same event handling function called by
  706. my main event loop.
  707.  
  708. "gCancel" is a global variable which is set to true by my event handlers
  709. when a user cancel event occurs.
  710.  
  711. "gLongOperation" is a global variable which records whether I'm busy doing
  712. something or idle. Some of the event handlers need to know this
  713. information.
  714.  
  715. I hope this is interesting and helps.
  716.  
  717. -- 
  718. John Norstad
  719. Academic Computing and Network Services
  720. Northwestern University
  721. j-norstad@nwu.edu
  722.  
  723. +++++++++++++++++++++++++++
  724.  
  725. >From jumplong@aol.com (Jump Long)
  726. Date: 4 Jun 1994 23:42:05 -0400
  727. Organization: America Online, Inc. (1-800-827-6364)
  728.  
  729. In article <j-norstad-0306942311440001@aragorn12.acns.nwu.edu>,
  730. j-norstad@nwu.edu (John Norstad) writes:
  731.  
  732. >(3) When waiting for a network task to complete (e.g., during an
  733. >asynchronous MacTCP send or receive call, while I'm polling the
  734. result
  735. >code in the parameter block), I call WNE continuously with sleep=0
  736. and
  737. >mouseRgn=nil...
  738.  
  739. If you're waiting for an asynchronous request to complete with a
  740. completion routine, then you can have the completion routine call
  741. WakeUpProcess using your application's process serial number.  That
  742. way, you can give up more time to other processes and still have your
  743. application awaken when it needs to be awakened.
  744.  
  745. - Jim Luther
  746.  
  747.  
  748. +++++++++++++++++++++++++++
  749.  
  750. >From j-norstad@nwu.edu (John Norstad)
  751. Date: Sun, 05 Jun 1994 08:48:16 -0500
  752. Organization: Northwestern University
  753.  
  754. In article <2srhid$572@search01.news.aol.com>, jumplong@aol.com (Jump
  755. Long) wrote:
  756.  
  757. > If you're waiting for an asynchronous request to complete with a
  758. > completion routine, then you can have the completion routine call
  759. > WakeUpProcess using your application's process serial number.  That
  760. > way, you can give up more time to other processes and still have your
  761. > application awaken when it needs to be awakened.
  762.  
  763. But then you can't poll for user cancel events, which is very important
  764. when waiting for long network requests to complete.
  765.  
  766. -- 
  767. John Norstad
  768. Academic Computing and Network Services
  769. Northwestern University
  770. j-norstad@nwu.edu
  771.  
  772. ---------------------------
  773.  
  774. >From Paul Goyette <goyettep@ccnet.com>
  775. Subject: What is "Clipping Extension"?
  776. Date: 5 Jun 1994 15:17:58 GMT
  777. Organization: (none)
  778.  
  779. The title says it all - I've installed the Drag&Drop stuff, and when I
  780. reboot the Mac,
  781. I get a message that the Clipping Extension cannot be used because it is
  782. "too new".
  783.  
  784. So, what is this Cliping Extension, and what version of what program do I
  785. need to
  786. be able to use it?
  787.  
  788. - ---------------------------------------------------------
  789. Paul Goyette        |  PGP Public key available on request 
  790. goyettep@ccnet.com  |  Fingerprint: 54 03 19 EE 99 57 FB 79
  791.                     |               74 0A D0 E6 BE 84 0E DA
  792. - ---------------------------------------------------------
  793.  
  794. +++++++++++++++++++++++++++
  795.  
  796. >From Richard Cardona <rickc@mail.utexas.edu>
  797. Date: 5 Jun 1994 17:43:21 GMT
  798. Organization: UT-Austin
  799.  
  800. In article <2ssqb6$apf@ccnet.ccnet.com> Paul Goyette, goyettep@ccnet.com
  801. writes:
  802. >So, what is this Cliping Extension, and what version of what program do I
  803. >need to
  804. >be able to use it?
  805.  
  806. In System 7.0.x, you need to run Macintosh Drag and Drop and the clipping
  807. extension to have full clipping files support.  What are clipping files? 
  808. They are Drag and Drop data the finder can support and create files out
  809. of.  Right now I believe the Finder only supports text, pictures and
  810. sound.  Moovs are in the works.  With the clipping extension, the finder
  811. can even open the clipping files and show you what they contain - neato!
  812. Example, highlight a piece of text from SimpleText and drag it over to
  813. the Finder, release it, and the Finder will create a text clipping file. 
  814. You must have the clipping extension to do this.  Similarly, a text
  815. clipping file can be dragged back into Simpletext and "pasted."
  816.  
  817. In System 7.5,the clipping extension is useless and built in to the
  818. Finder, but you still need the Drag and Drop extension for now.
  819.  
  820. I suggest you get a copy of both the Drag and Drop extension 1.1 and the
  821. Clipping extension from June's Developer CD.  The documentation is also a
  822. little confusing, claiming you need Finder 7.1.3 also.  (7 Pro's Finder
  823. is 7.1.4)  But, I know this combo works together (at least on a
  824. Powermac).  I don't have an on-line ftp site for the clipping extension,
  825. anyone? The WWDC contains the Drag and Drop extension for 7.5 I don't
  826. recommend this version for use without 7.5.
  827.  
  828. Rick
  829.  
  830. +++++++++++++++++++++++++++
  831.  
  832. >From Jens Alfke <jens_alfke@powertalk.apple.com>
  833. Date: Mon, 6 Jun 1994 20:29:54 GMT
  834. Organization: Apple Computer
  835.  
  836. Paul Goyette, goyettep@ccnet.com writes:
  837. > So, what is this Cliping Extension, and what version of what program do I
  838. > need to
  839. > be able to use it?
  840.  
  841. You need Finder 7.1.3 or 7.1.4. (7.1.4 is identical to 7.1.3 except for the
  842. size of a text field in the 'About This Mac' window, to support the
  843. PowerMacs.)
  844.  
  845. Richard Cardona, rickc@mail.utexas.edu writes:
  846. > Right now I believe the Finder only supports text, pictures and
  847. > sound.  Moovs are in the works.
  848.  
  849. The Finder will make clipping files out of any kind of data an application
  850. can drop, and you can then take those clippings and drop them into another
  851. app. The only type limitations are what kinds of clippings the Finder can
  852. open up and display -- only text and pict, right now.
  853.  
  854. > I suggest you get a copy of both the Drag and Drop extension 1.1 and the
  855. > Clipping extension from June's Developer CD.
  856.  
  857. D&D 1.1 is also on the bookmark CD with 'develop' 18. This includes Finder
  858. 7.1.3.
  859.  
  860. --Jens Alfke
  861.   jens_alfke@powertalk              Rebel girl, rebel girl,
  862.             .apple.com              Rebel girl you are the queen of my world
  863.  
  864. ---------------------------
  865.  
  866. >From valentin+@pitt.edu (Shawn V. Hernan)
  867. Subject: allocating memory quickly -- how?
  868. Date: 2 Jun 1994 20:28:04 GMT
  869. Organization: The University of Pittsburgh
  870.  
  871. Greetings all, 
  872.  
  873.  
  874.      I want to allocate a large array (1000 elements) of pointers to
  875. characters the beginning of a program (it makes sense to do it this way
  876. in this case) . So, in a loop, I have code that looks like the
  877. following:
  878.  
  879.     array[i][j] = NewPtrClear(80);
  880.  
  881.     I have a similar Unix and VMS program that uses malloc in the same
  882. way I use NewPtr above. All three programs work pretty well, excpet
  883. that allocating the memory on the Macintosh is VERY SLOOOOOOW. Is there
  884. a faster way to allocate lots of little chunks of memory than NewPtr?
  885. malloc dies a cold death on the Mac, and I don't know why. I've looked
  886. through the faq's with no luck. 
  887.  
  888.  
  889.        Any help is deeply appreciated. 
  890.  
  891. Thanks, 
  892. Shawn
  893.  
  894.  
  895.  
  896.  
  897. Shawn Valentine Hernan       |Is the War on Drugs worth it?  
  898. The University of Pittsburgh |Why does the government want your guns?  
  899. valentin+@pitt.edu           |Does RICO ring a bell?   
  900. 412-624-6425                 |Did you vote in the last election?
  901.  
  902. +++++++++++++++++++++++++++
  903.  
  904. >From mgr@aggroup.aggroup.com (Mike Russell)
  905. Date: Thu, 02 Jun 1994 15:36:06 -0800
  906. Organization: the ag group, inc.
  907.  
  908. In article <2slfcl$78r@usenet.srv.cis.pitt.edu>, valentin+@pitt.edu (Shawn
  909. V. Hernan) wrote:
  910. >      I want to allocate a large array (1000 elements) of pointers to
  911. > characters the beginning of a program (it makes sense to do it this way
  912. >     array[i][j] = NewPtrClear(80);
  913.  
  914. try allocating one giant block instead:
  915.  
  916.  char *p = NewPtrClear(80L * height * width);
  917.  
  918. then in your loop
  919.  
  920.  array[i][j] = p + ((long)i * (long)j) * 80L;
  921.  
  922. As for why - the reason goes back to the original tiny Mac that the
  923. Memory Manager was designed for.  Call it a homage to history.
  924.  
  925. +++++++++++++++++++++++++++
  926.  
  927. >From stk@uropax.contrib.de (Stefan Kurth)
  928. Date: 3 Jun 1994 04:06:01 +0200
  929. Organization: Contributed Software GbR
  930.  
  931. In article <2slfcl$78r@usenet.srv.cis.pitt.edu>,
  932. Shawn V. Hernan <valentin+@pitt.edu> wrote:
  933.  
  934. > that allocating the memory on the Macintosh is VERY SLOOOOOOW. Is there
  935. > a faster way to allocate lots of little chunks of memory than NewPtr?
  936.  
  937. NewHandle might be a little bit faster than NewPtr, depending on how many
  938. relocatable blocks you have in your heap; however, I doubt that the
  939. difference will be very big.
  940.  
  941. > malloc dies a cold death on the Mac, and I don't know why.
  942.  
  943. What problems do you have with malloc?
  944.  
  945. In the program that I'm currently writing, I have to deal with
  946. ten-thousands of very small blocks; at first I used handles for all of
  947. them, because, well, we're on a Mac, and "one uses" handles on a Mac. Later
  948. I have changed all the code to use malloc instead, and some portions of the
  949. program are now more than twice as fast (especially the routines that
  950. allocate lots of blocks). I'm not very happy about the fact that free()
  951. never releases the memory that has been allocated, but speed is more
  952. important for me than that (in this case at least - normally I don't use
  953. malloc in my programs).
  954.  
  955. ________________________________________________________________________
  956. Stefan Kurth                 Berlin, Germany              stk@contrib.de
  957.  
  958. +++++++++++++++++++++++++++
  959.  
  960. >From rang@winternet.com (Anton Rang)
  961. Date: 04 Jun 1994 23:45:19 GMT
  962. Organization: Minnesota Angsters
  963.  
  964. In article <coopem-030694133005@coopem.dialup.access.net> coopem@panix.com (Marc Cooperman) writes:
  965. >In my limited experience in mac programming, I read somewhere that the Mac
  966. >memory manager was designed to manage a system with small memory (like 128K
  967. >- remember that). So basically any memory operation can cause the heap to
  968. >be compacted - the mac is trying to optimize memory utilization and
  969. >minimize fragmentation.
  970.  
  971.   This is true to some extent.  If you use pointers much, you'll get
  972. quite a lot of memory shuffling, because the memory manager tries to
  973. keep all of the non-relocatable blocks together.  If you use handles
  974. instead, and call MaxApplZone() at the beginning of your program,
  975. there won't be too much shuffling going on.
  976.  
  977.   I should also note that I got some information in the mail a couple
  978. of months ago from a company that makes a replacement for the whole
  979. malloc()/newptr()/newhandle() suite.  I think it's called SmartHeap.
  980. Looked pretty interesting, for programs which need to do a *lot* of
  981. memory allocation.
  982. --
  983. Anton Rang (rang@winternet.com)
  984.  
  985. +++++++++++++++++++++++++++
  986.  
  987. >From shawn@greebe (shawn@mdli.com)
  988. Date: Mon, 6 Jun 1994 16:43:15 GMT
  989. Organization: HoloNet National Internet Access System: 510-704-1058/modem
  990.  
  991. Shawn V. Hernan (valentin+@pitt.edu) wrote:
  992. > malloc dies a cold death on the Mac, and I don't know why. I've looked
  993. > through the faq's with no luck.
  994.  
  995. Assuming that you are using Think C, the dead malloc may actually be a 
  996. problem where you might be overrunning the limits of your allocated
  997. block. In Think C this can corrupt the next structure in such a way that
  998. is frequently locks up the machine at the next memory allocation call
  999. which tries to use this memory. Is it possible that you are trying to
  1000. store 80 character strings in those character pointers ? The terminating
  1001. null would them blow out the next allocation and cause just this sort
  1002. of behavior.
  1003.  
  1004. This is a long standing Think C behavior and lots of people have run into
  1005. it, not really a bug (you are after all overrunning your allocation), 
  1006. but quite annoying.
  1007.  
  1008. I agree with the original poster about allocation of a single large block
  1009. and then assigning the addresses, this is often faster. Think actually uses
  1010. a variation of this for malloc.
  1011.  
  1012. Shawn Lavin (shawn@mdli.com)
  1013. As always, my opinions are my own
  1014.  
  1015.  
  1016. ---------------------------
  1017.  
  1018. >From brandyn@apple.com (Brandyn Webb)
  1019. Subject: sqrti() [Re: Faster Square Root Algorithm]
  1020. Date: 27 May 1994 16:28:39 -0700
  1021. Organization: Apple Computer Inc, Cupertino, CA
  1022.  
  1023.     Here's the integer sqrt() code I use; it looks similar to
  1024. some others posted, but may be a little faster (or slower; who
  1025. knows).  Hope someone finds it useful:
  1026.  
  1027.  
  1028. #define iterate(e)            \
  1029.     y <<= 1;                \
  1030.     temp = (y|1)<<(2*e);    \
  1031.     if (temp <= X) {        \
  1032.         y |= 2;                \
  1033.         X -= temp;             \
  1034.     }                 
  1035.  
  1036. unsigned sqrti(X)
  1037. register unsigned X;
  1038. {
  1039.     register unsigned yy, y, temp;
  1040.  
  1041.     y = 0;
  1042.     iterate(15); iterate(14); iterate(13); iterate(12);
  1043.     iterate(11); iterate(10); iterate(9); iterate(8);
  1044.     iterate(7); iterate(6); iterate(5); iterate(4);
  1045.     iterate(3); iterate(2); iterate(1); iterate(0);
  1046.     return y>>1;
  1047. }
  1048.  
  1049.  
  1050.     -Brandyn (brandyn@brainstorm.com)
  1051.  
  1052.  
  1053. +++++++++++++++++++++++++++
  1054.  
  1055. >From lakeland@mu.sans.vuw.ac.nz (Corrin Lakeland)
  1056. Date: 6 Jun 1994 00:55:23 GMT
  1057. Organization: SANS, Victoria University of Wellington, New Zealand.
  1058.  
  1059. > [Another SQRT routine]
  1060.  
  1061. I was just wondering, would it not be faster to set up a log table in 
  1062. memory and use that for calculating square roots.  Depending on how much 
  1063. speed and or accuracy you need you could change the table (speed = 
  1064. greater range, accuricy = more choices).  This should be very fast to 
  1065. look up if you are doing square roots extensivly - otherwise the memory 
  1066. use would make it not worth while.  
  1067.  
  1068. Disclaimer : I have not tested this meathod for speed, while it will 
  1069. work, it may turn out to be slower or use excessive amounts of ram.
  1070.  
  1071. Corrin Lakeland (lakeland@mu.sans.vuw.ac.nz)
  1072.  
  1073. +++++++++++++++++++++++++++
  1074.  
  1075. >From afcjlloyd@aol.com (AFC JLloyd)
  1076. Date: 6 Jun 1994 02:51:02 -0400
  1077. Organization: America Online, Inc. (1-800-827-6364)
  1078.  
  1079. In article <2sts5r$41e@st-james.comp.vuw.ac.nz>,
  1080. lakeland@mu.sans.vuw.ac.nz (Corrin Lakeland) writes:
  1081.  
  1082. >> [Another SQRT routine]
  1083. >
  1084. >I was just wondering, would it not be faster to set up a log table
  1085. in 
  1086. >memory and use that for calculating square roots.  Depending on how
  1087. much 
  1088. >speed and or accuracy you need you could change the table (speed = 
  1089. >greater range, accuricy = more choices).  This should be very fast
  1090. to 
  1091. >look up if you are doing square roots extensivly - otherwise the
  1092. memory 
  1093. >use would make it not worth while.  
  1094. >
  1095. >Disclaimer : I have not tested this meathod for speed, while it will
  1096.  
  1097. >work, it may turn out to be slower or use excessive amounts of ram.
  1098.  
  1099. If you're willing to use a table lookup method, a technique that I
  1100. have found to be very fast is to compute a table of square roots and
  1101. use entries from it to seed Newton-Raphson.  The trick is to estimate
  1102. Log2(N) by finding the topmost set bit of N.  Then use this estimate
  1103. to "normalize" N into an index in the lookup table, lookup the value,
  1104. and then "denormalize" the value back into the correct range.  Once
  1105. you have this estimate, you only need a very small number of
  1106. iterations.  For example, a table of 128 values provides initial
  1107. seeds accurate enough to compute the square root of a 32-bit integer
  1108. in just one iteration of Newton-Raphson.  The same table can be used
  1109. to do Fixed or Fract square roots in two iterations each.  If a table
  1110. of 128 values is too large then you can reduce the table down to 32
  1111. (maybe 16) entries and then do one more iteration of Newton-Raphson.
  1112.  
  1113. Jim Lloyd
  1114. afcjlloyd@aol.com
  1115.  
  1116.  
  1117. ---------------------------
  1118.  
  1119. End of C.S.M.P. Digest
  1120. **********************
  1121.  
  1122.  
  1123.  
  1124.